package com.gbb.common.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.Locale;

import android.content.Context;
import android.os.Environment;

/**
 * 文件操作工具类
 *
 * @author gaobingbing
 */
public final class FileUtils {

    /**
     * 判断是否有SD卡
     *
     * @return true:存在
     */
    public static boolean hasSdcard() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    /**
     * 获取设备SD卡路径
     * <p>一般是/storage/emulated/0/</p>
     *
     * @return SD卡路径
     */
    public static String getSDCardPath() {
        return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
    }

    /***
     * 获取文件扩展名
     *
     * @param filename 完整文件名
     * @return 返回文件扩展名
     */
    public static String getExtensionName(String filename) {
        if((filename != null) && (filename.length() > 0)) {
            int dot = filename.lastIndexOf('.');
            if((dot > -1) && (dot < (filename.length() - 1))) {
                return filename.substring(dot + 1);
            }
        }
        return filename;
    }

    /**
     * 判断是否是url
     *
     * @param url URL
     * @return true:是URL
     */
    public static boolean isUrl(String url) {
        if(url == null) {
            throw new NullPointerException("请传入有效的URL地址");
        }
        String uri = url.toLowerCase(Locale.getDefault());
        return uri.contains("http://") || uri.contains("https://");
    }

    /**
     * 根据路径判断文件是否存在
     *
     * @param filePath 文件路径
     * @return true:存在 false:不存在
     */
    public static boolean isFileExists(String filePath) {
        if(filePath == null) {
            throw new NullPointerException("请传入有效的文件夹或文件路径");
        }
        return new File(filePath).exists();
    }

    /**
     * 如果文件夹不存在就创建文件夹
     *
     * @param dirPath 文件夹路径
     * @return 文件夹路径
     */
    public static String createFolder(String dirPath) {
        if(dirPath == null) {
            throw new NullPointerException("请传入有效的文件夹路径");
        }
        File dir = new File(dirPath);
        if(!dir.exists()) {
            dir.mkdirs();
        }
        return dirPath;
    }

    /**
     * 如果文件不存在就创建文件
     *
     * @param filePath 文件夹路径
     * @return 文件路径
     */
    public static String createFile(String filePath) {
        if(filePath == null) {
            throw new NullPointerException("请传入有效的文件路径");
        }
        return createFile(new File(filePath));
    }

    /**
     * 如果文件不存在就创建文件
     *
     * @param file File文件
     * @return 文件路径
     */
    public static String createFile(File file) {
        boolean isSuccess = false;
        if(!file.exists()) {
            try {
                isSuccess = file.getParentFile().createNewFile();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        return isSuccess ? file.getAbsolutePath() : "";
    }

    /**
     * 删除指定目录下文件及目录
     *
     * @param filePath 文件或文件夹路径
     */
    public static boolean deleteFolderFile(String filePath) {
        try {
            File file = new File(filePath);
            if(!file.exists()) {
                return false;
            }
            // 删除文件夹下的所有文件
            if(file.isDirectory()) {
                File[] files = file.listFiles();
                for(File fileItem : files) {
                    deleteFolderFile(fileItem.getAbsolutePath());
                }
            }
            file.delete();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 读取文件内容
     *
     * @param filePath 文件路径
     */
    public static String readFile(String filePath) {
        BufferedReader bufReader = null;
        StringBuilder readStr = new StringBuilder();
        try {
            File file = new File(filePath);
            FileReader fileReader = new FileReader(file);
            bufReader = new BufferedReader(fileReader);
            String read;
            while((read = bufReader.readLine()) != null) {
                // read = read + " /r/n ";
                readStr.append(read);
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(bufReader != null) {
                    bufReader.close();
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }

        return readStr.toString();
    }

    /**
     * 向文本文件中写入内容
     *
     * @param filePath 文件路径
     * @param fileContent 写入内容
     * @param append 是否附加（新内容添加在尾部）
     */
    public static void writeFile(String filePath,String fileContent,boolean append) {
        FileWriter fileWriter = null;
        RandomAccessFile file = null;
        try {
            File newFile = new File(filePath);
            if(!newFile.exists()) {
                newFile.createNewFile();
            }
            fileWriter = new FileWriter(newFile,append);
            // 删除原有文件的内容
            file = new RandomAccessFile(filePath,"rw");
            file.setLength(0);
            // 写入新的文件内容
            fileWriter.write(fileContent);
            fileWriter.flush();
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(fileWriter != null) {
                    fileWriter.close();
                }
                if(file != null) {
                    file.close();
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将文件从assets=拷贝=>SD
     *
     * @param context 上下文
     * @param assetsFilePath 文件在assets中的位置
     * @param sdFilePath 需要拷贝到SD卡中的位置
     * @return 是否copy成功
     */
    public static boolean copyFileFromAssetsToLocal(Context context,String assetsFilePath,String sdFilePath) {
        boolean isSuccess = true;
        InputStream inputStream = null;
        OutputStream outputStream = null;

        // 判断SD卡是否存在该文件
        File file = new File(sdFilePath);
        if(file.exists()) {
            return true;
        }

        // 开始复制
        try {
            file.createNewFile();

            inputStream = context.getAssets().open(assetsFilePath);
            outputStream = new FileOutputStream(file);

            int nLen = 0;

            byte[] buff = new byte[1024];
            while((nLen = inputStream.read(buff)) > 0) {
                outputStream.write(buff,0,nLen);
            }
        } catch(Exception e) {
            e.printStackTrace();
            isSuccess = false;
        } finally {
            try {
                if(outputStream != null) {
                    outputStream.close();
                }
                if(inputStream != null) {
                    inputStream.close();
                }
            } catch(IOException e) {
                e.printStackTrace();
                isSuccess = false;
            }
        }
        return isSuccess;
    }

    /**
     * 将输入流转换成String
     *
     * @param inputStream 输入流
     * @return String
     */
    public static String inputStreamToString(InputStream inputStream) {
        String result = null;
        if(inputStream == null) {
            return null;
        }
        try {
            StringBuilder out = new StringBuilder();
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len = inputStream.read(buffer)) != -1) {
                out.append(new String(buffer,0,len));
            }
            result = out.toString();
        } catch(IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static boolean isPicture(String path) {
        return true;
    }

}
